#pragma once
#include "pid.h"

#define POWER_CHARGING_DEFAULT  ( (float)100.0f )

class Capacitor{
public:

    typedef enum 
    {
        Pow_Unlimited = 0, //没有功率限制
        Pow_Limited,        //有功率限制
        Pow_Stop            //停止
    }Power_Control_State;

    Power_Control_State CAP_STATE;
    Power_Control_State Pre_CAP_STATE;
    
    /*receive message, id 0x400*/
    float m_cap_vol;//que:这个电压是当前电压控制模块输出电压？
    float m_pow_in;//que:功控模块输入功率，实际上就是电管直接接超电并且传输给功控模块的功率，功率控制控的就是它，不过这个咱们这边不能直接控制，我们只是收到功控模块发过来的数据，我们可以通过控制发给各个电机的电流值来控制电机输出的功率，从而控制输入功率。输入功率有三个去向：电管模块本身耗电、超级电容充电（当我们当前底盘电机实际需要功率小于当前充电功率时多出来的去向）、电机输出功率。那么在电机没有功率需求时，输入功率也不应该为0，应该给电容充电，当电容充好电之后，输入功率可以用来维持电容中的能量。que:在考虑整场总功限制情况下，这样子会不会有些费电呢？
    float m_pow_out;//功控模块输出功率，要小于功控模块输入功率。que:这个能量应该是真实的底盘电机功率吧？
	float m_volt_out;//que:这个电压是功控模块输出到电机上的电压？
	unsigned char m_cap_error; //没有用过，应该是功控模块当前状态：判断是否正常工作

    /*send message, id 0x220*/
    float m_power_charging;//我们给功控模块发去的目标充电功率que：为什么功控的目标充电功率需要我们来决定呢？他们可以根据缓冲能、输出功率、当前输入功率、电容能量自行决定啊。实际调试时，power_in也不是跟着设定目标值变的？是因为充电充满了吗？即当前底盘使用的其实是电容内存储的能量，但是电容能量不能完全放完，所以功控模块实际上只要接收一点点输入功率就好了，power_in有明显的跟踪power_out的规律。

    float m_power_now;//当前裁判系统测得底盘使用的功率
    float m_power_buffer_next;//相对于当前下一个时刻缓冲能
    float m_power_buffer_now;//当前缓冲能
    float m_power_limit;//当前功率上限
    bool m_power_warning;//缓冲能降到30以下时警告
    unsigned int m_state_update_times;//单纯用来看这个模块是否在正常工作


    /*Discharge strategy variable*/
    bool REDICAL_FLAG;//que:激进的标志位？
    int CAP_Vol_cnt;//没用
    bool Cap_Warning; //没用
    double CAP_POW_USE;//当前功控模块输出功率与上限功率百分比que:为什么不用m_power_in/m_power_limit呢？
    double CAP_Cur_Coe;//当作一个系数，用来调节底盘电机输出电流大小，从而调节m_out大小。
    bool FLAG_CAP_Pow; //CAP_POW_USE大于0.5时置1，感觉没用
    unsigned char Cap_Vol_Pow_Limit_Flag;//没啥大用

    Pid *m_power_control_pid;

    void UpdateChargingPower(float power_now, float power_buffer_now, float power_limit);
    void UpdateOutState(void);
    void SetPowDes(float power_limit);
    void CapVolLimit(void);

    Capacitor() {
        m_power_charging = POWER_CHARGING_DEFAULT;
        m_power_warning = false;
        m_state_update_times = 0;

        CAP_Vol_cnt=0;

        REDICAL_FLAG = true;
        FLAG_CAP_Pow = false;

        CAP_POW_USE = 1;
        CAP_Cur_Coe = 1;

        Cap_Vol_Pow_Limit_Flag = 0;
        m_cap_vol = 0;
    };
};